package br.np2tec.soa.servicos;

import br.np2tec.soa.entidades.TaxaContrato;
import java.util.List;
import javax.jws.WebService;

@WebService()
public class CalcularTaxaContratoService {

   public List<TaxaContrato> calcularTaxaContrato(Integer quantidadeImpressoes, Double quilometrosDistancia, Double valorConcedido, Integer quantidadeAlteracoes) {

       List<TaxaContrato> listaTaxaContrato = null;

        if(quantidadeImpressoes > 0){
            TaxaContrato taxaImpressao = new TaxaContrato();
            taxaImpressao.setValorTaxa(calcularTaxaImpressao(quantidadeImpressoes));
            taxaImpressao.setTipoTaxa("Impressao");
            listaTaxaContrato.add(taxaImpressao);
        }

        if(quilometrosDistancia > 0){
            TaxaContrato taxaEntrega = new TaxaContrato();
            taxaEntrega.setValorTaxa(calcularTaxaEntrega(quilometrosDistancia));
            taxaEntrega.setTipoTaxa("Entrega");
            listaTaxaContrato.add(taxaEntrega);
        }

        if(quantidadeAlteracoes > 0){
            TaxaContrato taxaAlteracao = new TaxaContrato();
            taxaAlteracao.setValorTaxa(calcularTaxaAlteracao(quantidadeAlteracoes));
            taxaAlteracao.setTipoTaxa("Alteracao");
            listaTaxaContrato.add(taxaAlteracao);
        }

       TaxaContrato taxaIOF = new TaxaContrato();
       taxaIOF.setValorTaxa(calcularIOF(valorConcedido));
       taxaIOF.setTipoTaxa("IOF");
       listaTaxaContrato.add(taxaIOF);
       
       return listaTaxaContrato;
    }


    /**
     * A taxa de impressão é de R$3,17 por contrato impresso.
     * @param valor
     * @return
     */
    private Double calcularTaxaImpressao(Integer quantidadeImpressoes) {
        return quantidadeImpressoes * 3.17;
    }

    /**
     * A taxa de entrega do contrato é calculada da seguinte forma: km de distância X R$0,01.
     * Onde km de distância significa a quantidade de quilômetros que o CEP do destinatário está de distância.
     * @param valor
     * @return
     */
    private Double calcularTaxaEntrega(Double quilometrosDistancia) {
        return quilometrosDistancia * 0.01;
    }

    /**
     * O valor do IOF é de 0,0014% do montante que consta no pedido de crédito.
     * @param valor
     * @return
     */
    private Double calcularIOF(Double valor) {
        return valor * 0.0014;
    }

    /**
     * O valor da taxa de alteração do contrato é de R$0,33 x o número de alterações feitas.
     * @param valor
     * @return
     */
    private Double calcularTaxaAlteracao(Integer quantidadeAlteracoes) {
        return quantidadeAlteracoes * 0.33;
    }
}
